package dao;

import hbt.HibernateUtil;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import Dominio.Cliente;
import Dominio.Cotizacion;
import Dominio.ItemSolicitudDeCotizacion;
import Dominio.SolicitudDeCotizacion;

public class CotizacionDAO {

	
	private static CotizacionDAO instancia = null;
	private static SessionFactory sf = null;
	private Session session = null;
	
	public static CotizacionDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new CotizacionDAO();
		} 
		return instancia;
	}
	
	private Session getSession(){
		if(session == null || !session.isOpen())
			session = sf.openSession();
		return session;
	}
	
	public void closeSession(){
		if (session.isOpen()) session.close();
	}
	
	public void persistCotizacion(Cotizacion cotizacion){
		Session s=getSession();
		s.beginTransaction();
		//s.saveOrUpdate(cotizacion);
		s.persist(cotizacion);
		s.flush();
		s.getTransaction().commit();
	}
	
	public void updateCotizacion(Cotizacion cotizacion){
		Session s=getSession();
		s.beginTransaction();
		s.update(cotizacion);
		s.flush();
		s.getTransaction().commit();
	}
	
	//El nro de la cotizacion es el ID
	/*public Cotizacion getCotizacion(int numeroCotizacion){
		Cotizacion cotizacion = new Cotizacion();
		Session s=this.getSession();
		s.load(cotizacion, numeroCotizacion);
		return cotizacion;
	}*/
	
	public Cotizacion getCotizacion(int numeroCotizacion){
		Cotizacion cotizacion = new Cotizacion();
		Session s=this.getSession();
		cotizacion = (Cotizacion)s.createQuery("select cot from Cotizacion cot where cot.numeroCotizacion = " +numeroCotizacion).uniqueResult();
		return cotizacion;
	}
	
	
	public SolicitudDeCotizacion getSolicitudCotizacion(int numeroSolicitud){
		Session s=getSession();
		s.beginTransaction();
		SolicitudDeCotizacion solicitud = (SolicitudDeCotizacion)session
								.createQuery("from SolicitudDeCotizacion where id = :numeroSolicitud ")
								.setParameter("id", numeroSolicitud)
								.uniqueResult();
		s.getTransaction().commit();
		return solicitud;
	}
	
	//este no me cierra hay q ver bien como lo vamos a laburar
	public void agregarSolicitudCotizacion(List<SolicitudDeCotizacion> items){
		Session s= getSession();
		s.beginTransaction();
		for(SolicitudDeCotizacion sc:items)
			s.persist(sc);
		s.flush();
		s.getTransaction().commit();
	}
	
	public void agregarSolicitud(SolicitudDeCotizacion sc){
		Session s = getSession();
		s.beginTransaction();
		s.persist(sc);
		s.flush();
		s.getTransaction().commit();
	}
	
	
	@SuppressWarnings("unchecked")
	public List<SolicitudDeCotizacion> SolicitudesDeClientes(Cliente cliente){
	
	int id = cliente.getId();
	
	Session session = getSession();
	List<?> lista = session.createQuery("from SolicitudDeCotizacion sc where sc.idCliente = :id").setParameter("id", id).list();
	return (List<SolicitudDeCotizacion>)lista;
	
	}

	@SuppressWarnings("unchecked")
	public List<ItemSolicitudDeCotizacion> listaDeItemsDeSolicitud (SolicitudDeCotizacion solicitudCotizacion){
	
	int id = solicitudCotizacion.getId();
	Session s = this.getSession();
	List<ItemSolicitudDeCotizacion> lista = s.createQuery("from ItemSolicitudDeCotizacion isc where isc.idSolicitudCotizacion = :id").setParameter("id", id).list();
	return lista;
	}
	
	@SuppressWarnings("unchecked")
	public List<Cotizacion> listaDeCotizaciones (SolicitudDeCotizacion solicitudCotizacion){
	
	int id = solicitudCotizacion.getId();		
	Session s = this.getSession();
	List<?> lista = s.createQuery("from Cotizacion cot where cot.idSolicitudCotizacion = :id ").setParameter("id", id).list();
	return (List<Cotizacion>)lista;
	}

}
